#include <avr/sleep.h>
#include <avr/power.h>

int ACCPin = 2; //  
int sleepStatus = 0; //     (, ) -    

#define pinKIS1 7 //  HUB KIS
#define pinIsoAmp 6 //  ISOAmp
#define relePinTablet 10 // OTG +  
#define relePinAmp 9 // remote , 
#define pinRearCam 5 //    
#define ONKIS 100 //   KIS, isoAmp
#define ONTablet 2000 //   
#define ONAmp 4000 //   ,  RemoteAmp
#define OFFKIS 10000 //   KIS
#define OFFTablet 5000 //   
#define OFFAmp 4000 //   , 

unsigned long duration, millisold, off = 0;
boolean stateACC, relestate1, relestate2, relestate3 = 0;

int analogPin=6; //   
int knobBackHome=14; //   Back/Home
int data;
int dataJoystick;
unsigned long flag = 0;
unsigned long flagJoystick = 0;
unsigned long backHomeFlag = 0;
unsigned long eventTime = 0;
unsigned long eventTime1 = 0;
unsigned long pauseMillis = 0;


void wakeUpNow()                 //    
{
  if (sleepStatus)               //   ,
  {
    sleep_disable();             //  ,      -   
    sleepStatus = 0;             //     
    detachInterrupt(1);          //   -    wakeUpNow()   
  }
   
  // ,        loop()
  //   ,   (serial.print  ...)    
  //      - .  ,
  // ..    
}


void setup()
{
  pinMode(ACCPin, INPUT);
  attachInterrupt(1, wakeUpNow, FALLING);    //   1 (pin 2)    wakeUpNow
  pinMode(pinKIS1, OUTPUT); 
  pinMode(pinIsoAmp, OUTPUT); 
  pinMode(relePinTablet, OUTPUT);
  pinMode(relePinAmp, OUTPUT);
  pinMode(pinRearCam, OUTPUT);
  pinMode(knobBackHome, INPUT);
  Keyboard.begin();
  Serial.begin(115200);
  Serial1.begin(38400); 
}

void sleepNow()                          //     .
{
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);   //    
  sleep_enable();                        //  sleep-   mcucr.    
      
  attachInterrupt(1, wakeUpNow, FALLING);   //   1 (pin 2)    wakeUpNow       2
  
  sleepStatus = 1;                       //     
  sleep_mode();                          //      !!!
  //-------------------------     !!!--------------------------//
  Serial.begin(115200);
  Serial1.begin(38400); 
}


void loop()
{
  Power();
  BackHome();
  Joystick();
  Knopki();
  delay(10);
}

void Power()
 {
  if (!digitalRead(ACCPin)&&stateACC) 
    {
    stateACC=0;
    duration = millis();
    }
  if (digitalRead(ACCPin)&&!stateACC) 
    {
    stateACC=1;
    off = millis();
    }
  if(!digitalRead(ACCPin) && !stateACC && millis ()-duration > ONKIS)
    {
    digitalWrite(pinKIS1, HIGH);
    digitalWrite(pinIsoAmp, HIGH);
    relestate1 = 1;
    millisold = millis();
    }
  if(!digitalRead(ACCPin) && !stateACC &&  millis ()-duration > ONTablet)
    {
    digitalWrite(relePinTablet, HIGH);
    relestate2 = 1;
    millisold = millis();
    }
  if(!digitalRead(ACCPin) && !stateACC &&  millis ()-duration > ONAmp)
    {
    digitalWrite(relePinAmp, HIGH);
    relestate3 = 1;
    millisold = millis();
    }
  if(digitalRead(ACCPin) && stateACC && millis () -off> OFFKIS)
    {
    digitalWrite(pinKIS1, LOW);
    digitalWrite(pinIsoAmp, LOW);
    digitalWrite(pinRearCam, LOW);
    relestate1 = 0;
    millisold = millis();
    Serial.end();
    Serial1.end();
    delay(100);
    sleepNow(); 
    } 
  if(digitalRead(ACCPin) && stateACC &&  millis ()-off > OFFTablet)
    {
    digitalWrite(relePinTablet, LOW);
    relestate2 = 0;
    millisold = millis();     
    }
  if(digitalRead(ACCPin) && stateACC &&  millis ()-off > OFFAmp)
    {
    digitalWrite(relePinAmp, LOW);
    relestate3 = 0;
    millisold = millis();     
    }  
}

void BackHome()
{
  if(digitalRead(knobBackHome) == HIGH && backHomeFlag != 1) //  
    {
      eventTime1=millis();
      backHomeFlag = 0;
    }
  
  if(millis()-eventTime1>10 && millis()-eventTime1<499 && digitalRead(knobBackHome) == LOW && backHomeFlag == 0) backHomeFlag = 1;
  
  if(digitalRead(knobBackHome) == HIGH && backHomeFlag == 1) //     
   {
      Keyboard.press(KEY_ESC);
      Keyboard.releaseAll();
      backHomeFlag = 0;
    }
        
  if(millis()-eventTime1>500 && digitalRead(knobBackHome) == LOW && backHomeFlag == 1)
    {
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press(KEY_ESC);
      Keyboard.releaseAll();
      backHomeFlag = 2;
    }
}

void Joystick()
{
   if (Serial1.available() > 0)    //   
   { 
   dataJoystick = Serial1.read();  // 
   //Serial.println(dataJoystick);
   }
   
//**********************   *********************************   
  
  if(dataJoystick == 111)
   { 
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press('b');
    Keyboard.releaseAll();
    dataJoystick = 0;
   }
  if(dataJoystick == 110)
   { 
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press('d');
    Keyboard.releaseAll();
    dataJoystick = 0;
   }

//********************** Next  Fast Forward  **************************    

  if(dataJoystick == 107 && flagJoystick == 0)
   { 
    Remote.next();
    Remote.clear();
    dataJoystick = 0;
   }
  if(dataJoystick == 207 && flagJoystick == 0)
   { 
    Remote.forward();
    Remote.clear();
    dataJoystick = 0;
   }
  if(dataJoystick == 107 && flagJoystick == 1)
   { 
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press('v');
    Keyboard.releaseAll();
    dataJoystick = 0;
    flagJoystick = 1;
   }
   
//********************** Previous  Rewind  ************************************     

  if(dataJoystick == 106 && flagJoystick == 0)
   { 
    Remote.previous();
    Remote.clear();
    dataJoystick = 0;
   }
  if(dataJoystick == 206 && flagJoystick == 0)
   { 
    Remote.rewind();
    Remote.clear();
    dataJoystick = 0;
   }
  if(dataJoystick == 106 && flagJoystick == 1)
   { 
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press('f');
    Keyboard.releaseAll();
    dataJoystick = 0;
    flagJoystick = 1;
   }
   
//********************** UP  Down  **************************    

  if(dataJoystick == 109 && flagJoystick == 0)
   { 
    Remote.next();
    delay(10);
    Remote.next();
    Remote.clear();
    dataJoystick = 0;
    flagJoystick = 0;
   }
  if(dataJoystick == 108 && flagJoystick == 0)
   { 
    Remote.previous();
    delay(10);
    Remote.previous();
    Remote.clear();
    dataJoystick = 0;
    flagJoystick = 0;
   }   

//********************** mute + play/pause  ************************************     

  if(dataJoystick == 112 && flagJoystick == 0)
   { 
    Remote.play_pause();
    Remote.clear();
    dataJoystick = 0;
   }
  if(dataJoystick == 212 && flagJoystick == 0)
   { 
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press('m');
    Keyboard.releaseAll();
    dataJoystick = 0;
   }
  if(dataJoystick == 112 && flagJoystick == 1)
   {
    Remote.clear(); 
    flagJoystick = 0;
   }
   
//********************** back  ************************************     

  if(dataJoystick == 113)
   { 
    Keyboard.press(KEY_ESC);
    Keyboard.releaseAll();
    dataJoystick = 0;
    flagJoystick = 0;
   }
     if(dataJoystick == 213)
   { 
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press(KEY_ESC);
    Keyboard.releaseAll();
    dataJoystick = 0;
    flagJoystick = 0;
   }
   
//********************** media  ************************************     

  if(dataJoystick == 101)
   { 
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('r');
    Keyboard.releaseAll();
    dataJoystick = 0;
    flagJoystick = 0;
   }
  if(dataJoystick == 201)
   { 
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('f');
    Keyboard.releaseAll();
    dataJoystick = 0;
    flagJoystick = 0;
   }
   
//********************** menu  ************************************     

  if(dataJoystick == 102)
   { 
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('t');
    Keyboard.releaseAll();
    dataJoystick = 0;
    flagJoystick = 0;
   }
  if(dataJoystick == 202)
   { 
    digitalWrite(pinRearCam, !digitalRead(pinRearCam));
    dataJoystick = 0;
    flagJoystick = 0;
   }
   
//********************** tel  ************************************     

  if(dataJoystick == 103)
   { 
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('y');
    Keyboard.releaseAll();
    dataJoystick = 0;
    flagJoystick = 0;
   }
  if(dataJoystick == 203)
   { 
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('h');
    Keyboard.releaseAll();
    dataJoystick = 0;
    flagJoystick = 0;
   }

//********************** radio  ************************************     

  if(dataJoystick == 104)
   { 
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('u');
    Keyboard.releaseAll();
    dataJoystick = 0;
    flagJoystick = 0;
   }
  if(dataJoystick == 204)
   { 
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('j');
    Keyboard.releaseAll();
    dataJoystick = 0;
    flagJoystick = 0;
   }
   
//********************** nav  ************************************     

  if(dataJoystick == 105)
   { 
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('i');
    Keyboard.releaseAll();
    dataJoystick = 0;
    flagJoystick = 0;
   }
  if(dataJoystick == 205)
   { 
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('k');
    Keyboard.releaseAll();
    dataJoystick = 0;
    flagJoystick = 0;
   }
   
//********************** option  ************************************     

  if(dataJoystick == 114)
   { 
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('o');
    Keyboard.releaseAll();
    dataJoystick = 0;
    flagJoystick = 1;
   }
  if(dataJoystick == 214)
   { 
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('l');
    Keyboard.releaseAll();
    dataJoystick = 0;
    flagJoystick = 1;
   }  
}   

void Knopki()
{
  data=analogRead(analogPin); //   
  //Serial.println(data);
  
//**********************    ************************************

  if(data>=940 && flag == 0) //   
   {
    eventTime=millis();
   }

  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=210 && data<=230 && flag == 0) //     10  499  (  millis()-eventTime>10 && millis()-eventTime<499)
   { 
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press('b');
    flag = 5;
    Keyboard.releaseAll();
   }

  if(millis()-eventTime>500 && data>=210 && data<=230 && flag == 5 || data>=210 && data<=230 && flag == 3) //    500  ?  (  millis()-eventTime>500)
   { 
    Keyboard.press(KEY_LEFT_ALT); //    ,    0,1 
    Keyboard.press('b');
    flag = 3;
    Keyboard.releaseAll();
    delay(70);
   }

  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=456 && data<=476 && flag == 0) //     10  499  (  millis()-eventTime>10 && millis()-eventTime<499)
   { 
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press('d');
    flag = 6;
    Keyboard.releaseAll();
   }

  if(millis()-eventTime>500 && data>=456 && data<=476 && flag == 6 || data>=456 && data<=476 && flag == 3) //    500  ?  (  millis()-eventTime>500)
   { 
    Keyboard.press(KEY_LEFT_ALT); //    ,    0,1 
    Keyboard.press('d'); 
    flag = 3;
    Keyboard.releaseAll();
    delay(70);
   }
   
//********************** AltTab + Play/pause   ************************************    

if(millis()-eventTime>10 && millis()-eventTime<499 && data>=567 && data<=587) //     10  499  (  millis()-eventTime>10 && millis()-eventTime<499)
   { 
    flag = 1;
   }

  if(data>=940 && flag == 1 && pauseMillis == 0) //     , Alt+Tab
   {
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press(KEY_TAB);
    Keyboard.release(KEY_TAB);
    Keyboard.press(KEY_TAB);
    Keyboard.release(KEY_TAB);
    flag = 0;
    pauseMillis = millis();
   }
   
  if(data>=940 && flag == 1 && pauseMillis != 0) //      , Alt+Tab
   {
    Keyboard.press(KEY_TAB);
    Keyboard.release(KEY_TAB);
    flag = 0;
    pauseMillis = millis();
   }
   
  if(pauseMillis && millis()-pauseMillis >= 800 && data>=940) // && flag == 7 && data>=950)
  {
    flag = 0;
    pauseMillis = 0;
    Keyboard.releaseAll();
  } 
  
  if(millis()-eventTime>500 && data>=567 && data<=587 && flag == 1) //    500  ?  (  millis()-eventTime>500)
   { 
    Remote.play_pause(); //    ,  / 
    flag = 0;
    delay(10);
    Remote.clear();
   }
//********************** Next  Fast Forward   ************************************    
    
  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=0 && data<=20) //     10  499  (  millis()-eventTime>10 && millis()-eventTime<499)
   { 
    flag = 2;
   }
   
  if(data>=940 && flag == 2) //     , Next
   {
    Remote.next();
    flag = 0;
    delay(10);
    Remote.clear();
   }

  if(millis()-eventTime>500 && data>=0 && data<=20 && flag == 2 || data>=0 && data<=20 && flag == 3) //    500  ?  (  millis()-eventTime>500)
   { 
    Remote.forward(); //    , Fast Forward
    flag = 3;
    Remote.clear();
    delay(100);
   }
//********************** Previous  Rewind   ************************************    
    
  if(millis()-eventTime>10 && millis()-eventTime<499 && data>=74 && data<=94) //     10  499  (  millis()-eventTime>10 && millis()-eventTime<499)
   { 
    flag = 4;
   }
   
  if(data>=940 && flag == 4) //     , Previous
   {
    Remote.previous();
    flag = 0;
    delay(10);
    Remote.clear();
   }

  if(millis()-eventTime>500 && data>=74 && data<=94 && flag == 4 || data>=74 && data<=94 && flag == 3) //    500  ?  (  millis()-eventTime>500)
   { 
    Remote.rewind(); //    , Rewind
    flag = 3;
    Remote.clear();
    delay(100);
   }
   
  if(data>=940 && flag == 3 || data>=940 && flag == 5 || data>=940 && flag == 6) //    
   {
    flag = 0;
   }
}